import logging
import time

import pytest
import os
import sys
# # 获取项目根目录（假设 test_role_search.py 在 case 目录，上两级是项目根）
# project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# sys.path.append(project_root)  # 把根目录加入模块搜索路径
from dotenv import load_dotenv
from config.config import EnvConfig
import os
import shutil
from utils.log_util import setup_logger
from utils.shutil_util import *
from utils.zipfile_util import zip_allure_report
import pytest
from utils.email_util import Email_Utils
from config.constants import *


# 动态切换环境：终端执行命令pytest --env=dev（转开发环境）
def pytest_addoption(parser):
    parser.addoption(
        "--env",                  # 命令行参数名 (--env)
        action="store",          # 存储参数值
        default="test",          # 默认值（不指定时用测试环境）
        help="Environment to run tests against: dev, test, prod"  # 帮助说明
    )


# 在 pytest 的 fixture 中，autouse=True 表示该 fixture 会自动应用于所有测试用例，无需在测试函数中显式声明依赖。它会自动运行，无需通过参数传递
@pytest.fixture(scope="session", autouse=True)
def env_config(request):
    # 日志
    logg, log_file = setup_logger()
    # 清除旧的Allure报告数据和压缩文件
    clear_allure_results_dirs(['./temp/report', './zipfile/allure.zip'])

    env_name = request.config.getoption("--env")  # 获取命令行参数值
    logging.info(f"\n========== 正在加载环境: {env_name} ==========")
    logging.info(f"命令行参数获取到的环境名: {env_name}")
    logging.info(f"尝试加载文件: .env.{env_name}")

    config = EnvConfig()
    config.load(env_name)  # 启动时加载配置

    logging.info("加载后的配置:")
    logging.info(f"API_BASE_URL: {config.API_BASE_URL}")
    logging.info(f"AUTH_TOKEN: {config.AUTH_TOKEN}")
    logging.info(f"COOKIE: {config.COOKIE}")

    # # 清理报告
    # allure_dir = "reports/allure"
    # max_retries = 3
    #
    # for _ in range(max_retries):
    #     try:
    #         if os.path.exists(allure_dir):
    #             shutil.rmtree(allure_dir, ignore_errors=True)  # 忽略错误
    #             time.sleep(1)  # 增加延迟
    #         os.makedirs(allure_dir, exist_ok=True)
    #         break
    #     except Exception as e:
    #         print(f"清理目录失败: {e}")
    #         time.sleep(2)

    yield   # 不需要返回config，因为它已经是全局单例

    # 清理操作（如果需要）
    # 注意：这里不会还原环境变量，因为它们是进程级的
    logging.info(f"\n测试完成，使用的环境: {env_name}")

    # 压缩allure报告
    zip_allure_report('./temp', os.path.join(ZIPFILE_PATH, 'allure.zip'))
    # 调用发送邮箱方法
    print(f'******************************{logg}******************{log_file}**************************')

    # email_utils = Email_Utils()
    # email_utils.send_email(log_file)
